package com.major.queue;

public class CircleArrayQueueDemo {
    public static void main(String[] args) {
        CircleArrayQueue arrayQueue = new CircleArrayQueue(6);

        arrayQueue.addQueue(4);
        arrayQueue.addQueue(3);

        //arrayQueue.getQueue();


        arrayQueue.addQueue(8);

        arrayQueue.getQueue();
        //arrayQueue.getQueue();

        arrayQueue.showQueue();
        int head = arrayQueue.headQueue();
        System.out.println(head);

    }
}

class CircleArrayQueue{
    private int maxSize;
    private int front; // 初始值为0，指向队列的第一个元素  的   位置
    private int rear;  // 初始值为0，指向队列最后一个元素的后一个位置
    private int[] arr;

    // 构造
    public CircleArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
    }

    // 是否满
    boolean isFull() {
        return (rear  + 1) % maxSize == front;
    }

    // 是否空
    boolean isEmpty(){
        return rear == front;
    }

    // 加数据
    void addQueue(int n){
        if (isFull()){
            System.out.println("满了，不能加");
            return;
        }
        // 将数据直接加入
        arr[rear] = n;
        // rear后移，要考虑取模
        rear = (rear + 1) % maxSize;
    }

    // 取数据
    int getQueue(){
        if (isEmpty()){
            throw new RuntimeException("空，无数据");
        }
        // 临时变量储存，
        int val = arr[front];
        // front后移，考虑取模
        front = (front + 1) % maxSize;
        return val;
    }

    // 查看队列
    void showQueue(){
        if (isEmpty()){
            System.out.println("队列为空");
            return;
        }

        for (int i = front; i < front + size(); i++) {
            System.out.println("第 " + i % maxSize + " 位： "+ arr[i % maxSize]);
        }
    }

    // 队列有效数据长度
    int size(){
        return (rear + maxSize - front) % maxSize;
    }

    // 显示头数据
    int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("kong,没有数据");
        }
        return arr[front];
    }
}
